package com.zx._12_算法.数据结构.stack;

import java.util.Arrays;

/**
 * @version v1.0
 * @Project: knowledge
 * @Title: Demo1_Stack2   数组结构实现
 *
 *         push 添加一个元素到栈顶（向桶里放入一个羽毛球）
 *         pop 弹出栈顶元素（从桶里拿出一个羽毛球）
 *         top 返回栈顶元素，注意，不是弹出（看一眼桶里最顶端的羽毛球，但是不拿）
 *         isEmpty 判断栈是否为空（看看羽毛球是不是都用完了）
 *         size 返回栈里元素的个数（数一下桶里还有多少羽毛球）
 *         clear 清空栈（把桶里的羽毛球都倒出来扔掉）
 * @author: zhangxue
 * @date: 2019年7月22日下午10:21:30
 * @company: 未知之地
 * @Copyright: Copyright (c) 2019
 */
public class Stack2<T> {

    private int size;

    private int capacity = 100;

    private Node<T>[] array = new Node[capacity];

    public static void main(String[] args) {
        Stack2<Integer> stack = new Stack2<Integer>();

        printInfo(stack);

        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);

        printInfo(stack);

    }

    public static void printInfo(Stack2<?> stack) {
        System.out.println(stack);
        System.out.println(stack.top());
        System.out.println(stack.pop());
        System.out.println(stack.size());
        System.out.println(stack.isEmpty());
        System.out.println(stack);
    }

    public void push(T data) {
        Node<T> node = new Node<T>();
        node.data = data;
        array[size] = node;
        size++;
    }

    public T pop() {
        if (size == 0) {
            return null;
        }
        Node<T>[] arr = array;
        T data = arr[size - 1].data;
        arr[size - 1] = null;
        size--;
        array = arr;
        return data;
    }

    public T top() {
        return size == 0 ? null : array[size - 1].data;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public int size() {
        return size;
    }

    public void clear() {
        size = 0;
        array = new Node[capacity];
    }

    @Override
    public String toString() {
        return "Demo1_Stack2 [size=" + size + ", capacity=" + capacity + ", array=" + Arrays.toString(array) + "]";
    }

    @SuppressWarnings("hiding")
    class Node<T> {

        T data;

        @Override
        public String toString() {
            return data.toString();
        }

    }
}
